﻿using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;

public class TextEdit : EditorWindow
{
    public Font newFont;  // 新字体
    public Material newMaterial; //

    [MenuItem("Tools/Batch Update Font")]
    public static void ShowWindow()
    {
        EditorWindow.GetWindow(typeof(TextEdit));
    }

    private void OnGUI()
    {
        GUILayout.Label("Batch Update Text Font", EditorStyles.boldLabel);

        newFont = (Font)EditorGUILayout.ObjectField("New Font", newFont, typeof(Font), false);
        newMaterial = (Material)EditorGUILayout.ObjectField("New Material", newMaterial, typeof(Material), false);

        if (GUILayout.Button("Update All Text Fonts"))
        {
            if (newFont != null)
            {
                UpdateTextComponents();
            }
            else
            {
                Debug.LogWarning("Please assign a new font.");
            }
        }
    }

    private void UpdateTextComponents()
    {
        // 更新场景中的所有 Text 和 TextMeshProUGUI
        UpdateFontInScene();

        // 更新所有预制件中的 Text 和 TextMeshProUGUI
        UpdateFontInPrefabs();

        Debug.Log("Font update completed!");
    }

    // 更新场景中的 Text 和 TextMeshProUGUI
    private void UpdateFontInScene()
    {
        // 获取所有场景中的 UI Text 组件
        Text[] allTextComponents = FindObjectsOfType<Text>();
        foreach (var text in allTextComponents)
        {
            if (newFont != null)
            {
                text.font = newFont;  // 更新 UI Text 字体
            }
        }

        // 获取所有场景中的 TextMeshProUGUI 组件
        TextMesh[] allTMPTextComponents = FindObjectsOfType<TextMesh>();
        foreach (TextMesh tmpText in allTMPTextComponents)
        {
            if (newFont != null)
            {
                tmpText.font = newFont;  // 更新 TMP Text 字体
                tmpText.fontSize += 10;
                tmpText.gameObject.GetComponent<MeshRenderer>().material = newMaterial;
            }
        }

        // 刷新场景视图
        EditorUtility.SetDirty(this);
    }

    // 更新所有预制件中的 Text 和 TextMeshProUGUI
    private void UpdateFontInPrefabs()
    {
        // 获取场景中的所有预制件（Prefab）
        string[] prefabGuids = AssetDatabase.FindAssets("t:Prefab");  // 获取所有预制件的 GUID
        List<string> prefabPaths = new List<string>();

        foreach (var guid in prefabGuids)
        {
            string path = AssetDatabase.GUIDToAssetPath(guid);
            prefabPaths.Add(path);
        }

        // 遍历所有预制件并修改它们的 Text 组件
        foreach (var prefabPath in prefabPaths)
        {
            GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(prefabPath);
            if (prefab != null)
            {
                // 获取所有预制件中的 UI Text 组件
                Text[] prefabTextComponents = prefab.GetComponentsInChildren<Text>(true);
                foreach (var text in prefabTextComponents)
                {
                    if (newFont != null)
                    {
                        text.font = newFont;  // 更新 UI Text 字体
                    }
                }

                // 获取所有预制件中的 TextMeshProUGUI 组件
                TextMesh[] prefabTMPTextComponents = prefab.GetComponentsInChildren<TextMesh>(true);
                foreach (var tmpText in prefabTMPTextComponents)
                {
                    if (newFont != null)
                    {
                        tmpText.font = newFont;  // 更新 TMP Text 字体
                        tmpText.fontSize += 10;
                        tmpText.gameObject.GetComponent<MeshRenderer>().material = newMaterial;
                    }
                }

                // 标记预制件为已修改
                EditorUtility.SetDirty(prefab);
                AssetDatabase.SaveAssets();
                //Debug.LogError(prefab.name);

            }
        }
    }
}
